package com.wjw.java.games.tankgame2;

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Vector;

/**
 * 我的画板：游戏的绘图区
 * 为了监听键盘事件,需要实现KeyListener接口,并重写方法
 */
public class MyPanel extends JPanel implements KeyListener{
    //自己的坦克
    HeroTank myTank = null;
    //敌人的坦克,这里需要用Vector,线程安全的
    Vector<EnemyTank> enemyTanks = new Vector<>();
    int enemyTankSize = 3;

    /**
     * 1.初始化画板,然后画自己的坦克和敌人的坦克
     */
    public MyPanel(){
        System.out.println("初始化MyPanel画板...");
        //自己的坦克
        myTank = new HeroTank(500,500);
        myTank.setSpeed(10);//设置tank移动的速度
        //敌人的坦克
        for (int i = 0; i < enemyTankSize; i++) {
            EnemyTank enemyTank = new EnemyTank((100 * (i + 1)), 0);
            enemyTank.setDirection(2);//设置炮筒向下
            enemyTanks.add(enemyTank);//加入到Vector集合中
        }
    }

    /**
     * 2.绘图方法,什么时候被调用：
     * 当组件第一次在屏幕上显示时
     * 窗口最大、最小化时
     * 窗口大小发生变化时
     * repaint函数被调用时(刷新组件外观的函数)
     * @param g
     */
    @Override
    public void paint(Graphics g) {
        super.paint(g);
        //填充矩形
        g.fillRect(0,0,1000,750);
        //画朝上的坦克
        //drawTank(myTank.getX(),myTank.getY(),g,0,1);
        //画朝右的坦克
        //drawTank(myTank.getX(),myTank.getY(),g,1,1);
        //画朝下的坦克
        //drawTank(myTank.getX(),myTank.getY(),g,2,1);
        //画朝左的坦克
        //drawTank(myTank.getX(),myTank.getY(),g,3,1);

        //画自己的坦克
        drawTank(myTank.getX(),myTank.getY(),g,myTank.getDirection(),1);
        //画敌人的坦克,遍历Vector
        for (int i = 0; i < enemyTanks.size(); i++) {
            EnemyTank enemyTank = enemyTanks.get(i);
            drawTank(enemyTank.getX(),enemyTank.getY(),g,enemyTank.getDirection(),0);

        }
    }

    /**
     * 3.画坦克的方法
     * @param x             坦克的左上角x坐标
     * @param y             坦克的左上角y坐标
     * @param g             画笔
     * @param direction     坦克的朝向(0上、1右、2下、3左)顺时针
     * @param type          坦克的类型：0敌人的坦克,1我的坦克
     */
    public void drawTank(int x,int y,Graphics g,int direction,int type){
        //根据坦克的类型,设置颜色
        switch (type){
            case 0://敌人的坦克
                g.setColor(Color.cyan);//设置颜色
                break;
            case 1://我的坦克
                g.setColor(Color.yellow);//设置颜色
                break;
        }

        //根据坦克的方向,绘制坦克(0上、1右、2下、3左)顺时针
        switch (direction){
                /*fill3DRect:画3D矩形、fillOval画圆形、drawLine画线*/
            case 0://上
                g.fill3DRect(x,y,10,60,false);//画坦克左边的轮子
                g.fill3DRect(x+30,y,10,60,false);//画坦克右边的轮子
                g.fill3DRect(x+10,y+10,20,40,false);//画坦克中间的位置
                g.fillOval(x+10,y+20,20,20);//画坦克中间的盖子
                g.drawLine(x+20,y+30,x+20,y);//画坦克的炮筒
                break;
            case 1://右
                g.fill3DRect(x,y,60,10,false);//画坦克上边的轮子
                g.fill3DRect(x,y+30,60,10,false);//画坦克下边的轮子
                g.fill3DRect(x+10,y+10,40,20,false);//画坦克中间的位置
                g.fillOval(x+20,y+10,20,20);//画坦克中间的盖子
                g.drawLine(x+30,y+20,x+60,y+20);//画坦克的炮筒
                break;
            case 2://下
                g.fill3DRect(x,y,10,60,false);//画坦克左边的轮子
                g.fill3DRect(x+30,y,10,60,false);//画坦克右边的轮子
                g.fill3DRect(x+10,y+10,20,40,false);//画坦克中间的位置
                g.fillOval(x+10,y+20,20,20);//画坦克中间的盖子
                g.drawLine(x+20,y+30,x+20,y+60);//画坦克的炮筒
                break;
            case 3://左
                g.fill3DRect(x,y,60,10,false);//画坦克上边的轮子
                g.fill3DRect(x,y+30,60,10,false);//画坦克下边的轮子
                g.fill3DRect(x+10,y+10,40,20,false);//画坦克中间的位置
                g.fillOval(x+20,y+10,20,20);//画坦克中间的盖子
                g.drawLine(x+30,y+20,x,y+20);//画坦克的炮筒
                break;
            default:
                System.out.println("未知方向。。。");
        }
    }

    //有字符输出是,该方法就会触发
    @Override
    public void keyTyped(KeyEvent e) {

    }

    /**
     * 4.当键盘上的某个键被按下时,触发
     * 按下键：W上、D右、S下、A左,让tank动起来
     * 需切换到英文输入法
     * @param e
     */
    @Override
    public void keyPressed(KeyEvent e) {
        int keyCode = e.getKeyCode();
        /*System.out.println((char)keyCode +"键被按下...");*/

        if(keyCode == KeyEvent.VK_W){//W上
            myTank.setDirection(0);
            myTank.moveUp();
        }else if(keyCode == KeyEvent.VK_D){//D右
            myTank.setDirection(1);
            myTank.moveRight();
        }else if(keyCode == KeyEvent.VK_S){//S下
            myTank.setDirection(2);
            myTank.moveDown();
        }else if(keyCode == KeyEvent.VK_A){//A左
            myTank.setDirection(3);
            myTank.moveLeft();
        }

        //然后重绘一下
        this.repaint();//会触发paint()方法,重新绘图
    }

    //当按下的某个键松开时,触发
    @Override
    public void keyReleased(KeyEvent e) {

    }
}
